#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

#define MAXARGS 20
#define MAXLEN 100

int mybash5322(char *arglist[]);
int execute(char *arglist[]);
char *makestring(char *buf);


int main() {
    char *arglist[MAXARGS + 1];     //命令行输入
    int numargs;                    //计数
    char argbuf[MAXLEN];            //文本

    numargs = 0;
    while (numargs < MAXARGS) {
        printf("Arg[%d]? ", numargs);
        if (fgets(argbuf, MAXLEN, stdin) && *argbuf != '\n')
            arglist[numargs++] = makestring(argbuf);
        else {
            if (numargs > 0) {
                arglist[numargs] = NULL;
                mybash5322(arglist);
                numargs = 0;
            }
        }
    }
    return 0;
}

int mybash5322(char *arglist[])
{
    int pc,pr;
    pc=fork();                      //创建子进程
    pr=wait(NULL);                  //等待子进程终止并取得终止状态
    if(pc==0) execute(arglist);     //调用替换原程序
    else return 0;
}

int execute(char *arglist[])
{
    execvp(arglist[0],arglist);  //执行文件，arglist[0]为文件名，arglist为相应指令
    perror("execvp failed");     //将上一个函数的错误输出到标准输出设备
    exit(1);                     //异常退出
}

char *makestring(char *buf)
{
    char  *cp;
    buf[strlen(buf)-1] = '\0';
    cp = malloc( strlen(buf)+1 );
    if ( cp == NULL ){
        fprintf(stderr,"no memory\n");
        exit(1);
    }
    strcpy(cp, buf);
    return cp;
}
